/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package GlobalObservingSystem.Mundo;

import GlobalObservingSystem.Interfaces.IAdminUsuarios;
import GlobalObservingSystem.Interfaces.IMotorSucesos;
import GlobalObservingSystem.Interfaces.IOraculo;
import GlobalObservingSystem.Mundo.Usuarios.AdministradorUsuario;
import GlobalObservingSystem.Mundo.BaseDatos.AdministradorBD;
import GlobalObservingSystem.Mundo.BaseDatos.EventoBD;
import GlobalObservingSystem.Mundo.BaseDatos.UsuarioBD;
import GlobalObservingSystem.Mundo.Predicciones.Oraculo;
import GlobalObservingSystem.Mundo.RecepcionDatos.ManejadorTrama;
import java.util.Date;


/**
 *
 * @author js.rojas131
 */
public class GOS
{

    //------------------------------------------------
    //Atributos
    //------------------------------------------------

    private IAdminUsuarios admin;
    private IOraculo oraculo;
    private IMotorSucesos motor;

    public GOS()
    {
        AdministradorBD.getInstance();
        ManejadorTrama.getInstance();
        admin = new AdministradorUsuario();
        oraculo = new Oraculo();
        motor = null;

    }
    //------------------------------------------------
    //Métodos
    //------------------------------------------------

    /**
     * Registra un nuevo usuario
     * @param login
     * @param password
     * @param tipoUser
     * @param nombreUser
     * @param email
     * @return si se realizó el registro o no
     */
    public boolean registrarUsuario( String login, String password, String tipoUser, String nombreUser, String email )
    {
        return admin.registrarUsuario(login, password, tipoUser, nombreUser, email);
    }

    /**
     * Permite a un usuario ya registrado ingresar en el sistema
     * @param login
     * @param password
     * @return si se realizó la operación o se denegó el acceso
     */
    public boolean ingresarSistema( String login, String password)
    {
        return admin.ingresarSistema(login, password);
    }

    /**
     * Permite a un usuario modificar los datos
     * @param login
     * @param password
     * @param tipoUser
     * @param nombreUser
     * @param email
     * @return si se realizó o no la operación
     */
    public boolean modificarUsuario(String login, String password, String tipoUser, String nombreUser, String email)
    {
        return admin.modificarUsuario(login, password, tipoUser, nombreUser, email);
    }

    /**
     * Elimina al usuario actuamente en el sistema que haya hecho login
     * @return Si fue exitosa la eliminación
     */
    public boolean eliminarUsuario()
    {
        return admin.eliminarUsuario();
    }

    /**
     * Genera un reporte de datos entre ciertas fechas y ciertos puntos terrestres
     *  @param latitud1 primera coordenada del primer punto
     * @param longitud1 segunda coordenada del primer punto
     * @param latitud2 primera coordenada del segundo punto
     * @param longitud2 segunda coordenada del segundo punto
     * @param inicio fecha de inicio del reporte
     * @param fin fecha de fin del reporte
     * @return Cadena con la información del reporte
     */
    public String generarReporte(  Coordenada latitud1, Coordenada longitud1, Coordenada latitud2, Coordenada longitud2, Date inicio, Date fin )
    {
        return oraculo.generarReporte(latitud1, longitud1, latitud2, longitud2, inicio, fin);

    }

     /**
     * Predice el clima para una zona delimitada por dos puntos terrestres
     * @param tipoMedida el tipo de medidas tomadas en cuenta para predecir
     * @param latitud1 primera coordenada del primer punto
     * @param longitud1 segunda coordenada del primer punto
     * @param latitud2 primera coordenada del segundo punto
     * @param longitud2 segunda coordenada del segundo punto
     * @param tiempo fecha en que se toman los datos para la predicción
     * @return Cadena con la información de la predicción
     */
    public String predecirClima(Coordenada latitud1, Coordenada longitud1, Date tiempo)
    {
        short i=5;
        return oraculo.predecirClima(latitud1, longitud1, i, tiempo);
        //return oraculo.predecirClima( latitud1, longitud1, latitud2, longitud2, tiempo);
    }

    /**
     * Genera una alarma para un tipo de medida en una zona
     * @param tipoMedicion el tipo de medida a la que se le crea la alarma
     * @param latitud1 primera coordenada del primer punto
     * @param longitud1 segunda coordenada del primer punto
     * @param latitud2 primera coordenada del segundo punto
     * @param longitud2 segunda coordenada del segundo punto
     */
    public void generarAlarma(int tipoMedicion, Coordenada latitud1, Coordenada longitud1, Coordenada latitud2, Coordenada longitud2)
    {
        oraculo.generarAlarma(tipoMedicion, latitud1, longitud1, latitud2, longitud2);
    }

    /**
     *Este metodo consulta las alarmas historicas en un rango de fechas, un punto y un perímetro.
     * @param fechaInicial rango inicial.
     * @param fechaFinal rango final.
     * @param latitud1 latitud del vertice.
     * @param longitud1 longitud del vertice.
     * @param perimetro perimetro del punto.
     * @return retorna una coleción de eventos dentro del rango de busqueda.
     */
    public String consultarAlarmas(Date fechaInicial, Date fechaFinal, EventoBD latitud1, EventoBD longitud1, short perimetro)
    {
        return "";
    }

    public UsuarioBD darUsuario()
    {
        return admin.getUsuario();
    }

    public boolean suscribirSitio( double latitud, double longitud )
    {
        return admin.suscribirSitio(latitud, longitud);
    }

    public boolean existeUsuario( String login )
    {
        return admin.existeUsuario(login);
    }

    public boolean esClimatologo()
    {
        return admin.esClimatologo();
    }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")


 
}
